ಕನ್ನಡ

ರಿಯಾಕ್ಟ್‌ನ useId ಹುಕ್ ಅನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳಿ. ವರ್ಧಿತ ಪ್ರವೇಶಸಾಧ್ಯತೆ ಮತ್ತು ಹೈಡ್ರೇಷನ್‌ಗಾಗಿ ಸ್ಥಿರ, ಅನನ್ಯ, ಮತ್ತು SSR-ಸುರಕ್ಷಿತ IDಗಳನ್ನು ರಚಿಸಲು ಜಾಗತಿಕ ಡೆವಲಪರ್‌ಗಳಿಗಾಗಿ ಒಂದು ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ.

ರಿಯಾಕ್ಟ್‌ನ useId ಹುಕ್: ಸ್ಥಿರ ಮತ್ತು ಅನನ್ಯ ಗುರುತಿಸುವಿಕೆಗಳ ರಚನೆಯ ಆಳವಾದ ನೋಟ

ವೆಬ್ ಡೆವಲಪ್‌ಮೆಂಟ್‌ನ ಸದಾ ವಿಕಸಿಸುತ್ತಿರುವ ಜಗತ್ತಿನಲ್ಲಿ, ಸರ್ವರ್-ರೆಂಡರ್ ಮಾಡಿದ ವಿಷಯ ಮತ್ತು ಕ್ಲೈಂಟ್-ಸೈಡ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ನಡುವೆ ಸ್ಥಿರತೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳುವುದು ಬಹಳ ಮುಖ್ಯ. ಡೆವಲಪರ್‌ಗಳು ಎದುರಿಸುತ್ತಿದ್ದ ಅತ್ಯಂತ ನಿರಂತರ ಮತ್ತು ಸೂಕ್ಷ್ಮ ಸವಾಲುಗಳಲ್ಲಿ ಒಂದು ಅನನ್ಯ, ಸ್ಥಿರ ಗುರುತಿಸುವಿಕೆಗಳ (identifiers) ರಚನೆಯಾಗಿದೆ. ಲೇಬಲ್‌ಗಳನ್ನು ಇನ್‌ಪುಟ್‌ಗಳಿಗೆ ಸಂಪರ್ಕಿಸಲು, ಪ್ರವೇಶಸಾಧ್ಯತೆಗಾಗಿ (accessibility) ARIA ಅಟ್ರಿಬ್ಯೂಟ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಇತರ ಅನೇಕ DOM-ಸಂಬಂಧಿತ ಕಾರ್ಯಗಳಿಗಾಗಿ ಈ ID ಗಳು ನಿರ್ಣಾಯಕವಾಗಿವೆ. ವರ್ಷಗಳಿಂದ, ಡೆವಲಪರ್‌ಗಳು ಅಷ್ಟೊಂದು ಉತ್ತಮವಲ್ಲದ ಪರಿಹಾರಗಳನ್ನು ಅವಲಂಬಿಸಿದ್ದರು, ಇದು ಹೈಡ್ರೇಷನ್ ಮಿಸ್‌ಮ್ಯಾಚ್‌ಗಳು ಮತ್ತು ನಿರಾಶಾದಾಯಕ ಬಗ್‌ಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತಿತ್ತು. ಇಲ್ಲಿದೆ ರಿಯಾಕ್ಟ್ 18 ರ `useId` ಹುಕ್—ಈ ಸಮಸ್ಯೆಯನ್ನು ಸುಲಭವಾಗಿ ಮತ್ತು ಖಚಿತವಾಗಿ ಪರಿಹರಿಸಲು ವಿನ್ಯಾಸಗೊಳಿಸಲಾದ ಒಂದು ಸರಳ ಹಾಗೂ ಶಕ್ತಿಯುತ ಪರಿಹಾರ.

ಈ ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ ಜಾಗತಿಕ ರಿಯಾಕ್ಟ್ ಡೆವಲಪರ್‌ಗಳಿಗಾಗಿದೆ. ನೀವು ಸರಳ ಕ್ಲೈಂಟ್-ರೆಂಡರ್ ಮಾಡಿದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ಮಿಸುತ್ತಿರಲಿ, Next.js ನಂತಹ ಫ್ರೇಮ್‌ವರ್ಕ್‌ನೊಂದಿಗೆ ಸಂಕೀರ್ಣ ಸರ್ವರ್-ಸೈಡ್ ರೆಂಡರ್ಡ್ (SSR) ಅನುಭವವನ್ನು ರೂಪಿಸುತ್ತಿರಲಿ, ಅಥವಾ ಜಗತ್ತು ಬಳಸಲು ಕಾಂಪೊನೆಂಟ್ ಲೈಬ್ರರಿಯನ್ನು ರಚಿಸುತ್ತಿರಲಿ, `useId` ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು ಇನ್ನು ಮುಂದೆ ಐಚ್ಛಿಕವಲ್ಲ. ಇದು ಆಧುನಿಕ, ದೃಢವಾದ, ಮತ್ತು ಪ್ರವೇಶಸಾಧ್ಯವಾದ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಒಂದು ಮೂಲಭೂತ ಸಾಧನವಾಗಿದೆ.

useId ಗಿಂತ ಮೊದಲು ಇದ್ದ ಸಮಸ್ಯೆ: ಹೈಡ್ರೇಷನ್ ಮಿಸ್‌ಮ್ಯಾಚ್‌ಗಳ ಜಗತ್ತು

`useId` ಅನ್ನು ನಿಜವಾಗಿಯೂ ಶ್ಲಾಘಿಸಲು, ನಾವು ಮೊದಲು ಅದು ಇಲ್ಲದ ಜಗತ್ತನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕು. ಮೂಲಭೂತ ಸಮಸ್ಯೆಯೆಂದರೆ ರೆಂಡರ್ ಆದ ಪುಟದಲ್ಲಿ ಅನನ್ಯವಾಗಿರುವ ಮತ್ತು ಸರ್ವರ್ ಹಾಗೂ ಕ್ಲೈಂಟ್ ನಡುವೆ ಸ್ಥಿರವಾಗಿರುವ ID ಯ ಅವಶ್ಯಕತೆ.

ಒಂದು ಸರಳ ಫಾರ್ಮ್ ಇನ್‌ಪುಟ್ ಕಾಂಪೊನೆಂಟ್ ಅನ್ನು ಪರಿಗಣಿಸಿ:


function LabeledInput({ label, ...props }) {
  // ಇಲ್ಲಿ ನಾವು ಒಂದು ಅನನ್ಯ ID ಯನ್ನು ಹೇಗೆ ರಚಿಸುವುದು?
  const inputId = 'some-unique-id';

  return (
    
); }

ಸೆಮ್ಯಾಂಟಿಕ್ HTML ಮತ್ತು ಪ್ರವೇಶಸಾಧ್ಯತೆಗಾಗಿ `

ಪ್ರಯತ್ನ 1: `Math.random()` ಬಳಸುವುದು

ಒಂದು ಅನನ್ಯ ID ಯನ್ನು ರಚಿಸಲು ಸಾಮಾನ್ಯವಾಗಿ ಬರುವ ಮೊದಲ ಆಲೋಚನೆ ಯಾದೃಚ್ಛಿಕತೆಯನ್ನು (randomness) ಬಳಸುವುದು.


// ಆಂಟಿ-ಪ್ಯಾಟರ್ನ್: ಇದನ್ನು ಮಾಡಬೇಡಿ!
const inputId = `input-${Math.random()}`;

ಇದು ಏಕೆ ವಿಫಲವಾಗುತ್ತದೆ:

ಪ್ರಯತ್ನ 2: ಗ್ಲೋಬಲ್ ಕೌಂಟರ್ ಬಳಸುವುದು

ಸ್ವಲ್ಪ ಹೆಚ್ಚು ಸುಧಾರಿತ ವಿಧಾನವೆಂದರೆ ಸರಳವಾದ ಏರಿಕೆಯಾಗುವ ಕೌಂಟರ್ ಅನ್ನು ಬಳಸುವುದು.


// ಆಂಟಿ-ಪ್ಯಾಟರ್ನ್: ಇದೂ ಕೂಡ ಸಮಸ್ಯಾತ್ಮಕ
let globalCounter = 0;
function generateId() {
  globalCounter++;
  return `component-${globalCounter}`;
}

ಇದು ಏಕೆ ವಿಫಲವಾಗುತ್ತದೆ:

ಈ ಸವಾಲುಗಳು ಕಾಂಪೊನೆಂಟ್ ಟ್ರೀಯ ರಚನೆಯನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವ ರಿಯಾಕ್ಟ್-ನೇಟಿವ್, ನಿರ್ಣಾಯಕ (deterministic) ಪರಿಹಾರದ ಅಗತ್ಯವನ್ನು ಎತ್ತಿ ತೋರಿಸಿದವು. `useId` ನಿಖರವಾಗಿ ಅದನ್ನೇ ಒದಗಿಸುತ್ತದೆ.

`useId` ಪರಿಚಯ: ಅಧಿಕೃತ ಪರಿಹಾರ

`useId` ಹುಕ್ ಸರ್ವರ್ ಮತ್ತು ಕ್ಲೈಂಟ್ ರೆಂಡರ್‌ಗಳೆರಡರಲ್ಲೂ ಸ್ಥಿರವಾಗಿರುವ ಒಂದು ಅನನ್ಯ ಸ್ಟ್ರಿಂಗ್ ID ಯನ್ನು ರಚಿಸುತ್ತದೆ. ಪ್ರವೇಶಸಾಧ್ಯತೆ ಅಟ್ರಿಬ್ಯೂಟ್‌ಗಳಿಗೆ ರವಾನಿಸಲು ID ಗಳನ್ನು ರಚಿಸಲು ಇದನ್ನು ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್‌ನ ಉನ್ನತ ಮಟ್ಟದಲ್ಲಿ ಕರೆಯಲು ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ.

ಮೂಲ ಸಿಂಟ್ಯಾಕ್ಸ್ ಮತ್ತು ಬಳಕೆ

ಸಿಂಟ್ಯಾಕ್ಸ್ ಅತ್ಯಂತ ಸರಳವಾಗಿದೆ. ಇದು ಯಾವುದೇ ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವುದಿಲ್ಲ ಮತ್ತು ಒಂದು ಸ್ಟ್ರಿಂಗ್ ID ಯನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.


import { useId } from 'react';

function LabeledInput({ label, ...props }) {
  // useId() ":r0:" ನಂತಹ ಒಂದು ಅನನ್ಯ, ಸ್ಥಿರ ID ಯನ್ನು ರಚಿಸುತ್ತದೆ
  const id = useId();

  return (
    
); } // ಉದಾಹರಣೆ ಬಳಕೆ function App() { return (

ಸೈನ್ ಅಪ್ ಫಾರ್ಮ್

); }

ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, ಮೊದಲ `LabeledInput` ಗೆ `":r0:"` ನಂತಹ ID ಸಿಗಬಹುದು, ಮತ್ತು ಎರಡನೆಯದಕ್ಕೆ `":r1:"` ಸಿಗಬಹುದು. ID ಯ ನಿಖರವಾದ ಸ್ವರೂಪವು ರಿಯಾಕ್ಟ್‌ನ ಆಂತರಿಕ ವಿವರವಾಗಿದೆ ಮತ್ತು ಅದನ್ನು ಅವಲಂಬಿಸಬಾರದು. ಇದು ಅನನ್ಯ ಮತ್ತು ಸ್ಥಿರವಾಗಿರುತ್ತದೆ ಎಂಬುದು ಏಕೈಕ ಗ್ಯಾರಂಟಿ.

ರಿಯಾಕ್ಟ್ ಸರ್ವರ್ ಮತ್ತು ಕ್ಲೈಂಟ್‌ನಲ್ಲಿ ಒಂದೇ ಅನುಕ್ರಮದ ID ಗಳನ್ನು ರಚಿಸುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ, ಇದು ರಚಿತವಾದ ID ಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಹೈಡ್ರೇಷನ್ ದೋಷಗಳನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ನಿವಾರಿಸುತ್ತದೆ.

ಇದು ಪರಿಕಲ್ಪನಾತ್ಮಕವಾಗಿ ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ?

`useId` ಯ ಮ್ಯಾಜಿಕ್ ಅದರ ನಿರ್ಣಾಯಕ (deterministic) ಸ್ವಭಾವದಲ್ಲಿದೆ. ಇದು ಯಾದೃಚ್ಛಿಕತೆಯನ್ನು ಬಳಸುವುದಿಲ್ಲ. ಬದಲಾಗಿ, ಇದು ರಿಯಾಕ್ಟ್ ಕಾಂಪೊನೆಂಟ್ ಟ್ರೀಯಲ್ಲಿನ ಕಾಂಪೊನೆಂಟ್‌ನ ಮಾರ್ಗವನ್ನು ಆಧರಿಸಿ ID ಯನ್ನು ರಚಿಸುತ್ತದೆ. ಸರ್ವರ್ ಮತ್ತು ಕ್ಲೈಂಟ್‌ನಲ್ಲಿ ಕಾಂಪೊನೆಂಟ್ ಟ್ರೀಯ ರಚನೆಯು ಒಂದೇ ಆಗಿರುವುದರಿಂದ, ರಚಿತವಾದ ID ಗಳು ಹೊಂದಿಕೆಯಾಗುವುದು ಖಚಿತ. ಈ ವಿಧಾನವು ಕಾಂಪೊನೆಂಟ್ ರೆಂಡರಿಂಗ್ ಕ್ರಮಕ್ಕೆ ಸ್ಥಿತಿಸ್ಥಾಪಕವಾಗಿದೆ, ಇದು ಗ್ಲೋಬಲ್ ಕೌಂಟರ್ ವಿಧಾನದ ಪತನಕ್ಕೆ ಕಾರಣವಾಗಿತ್ತು.

ಒಂದೇ ಹುಕ್ ಕರೆಯಿಂದ ಅನೇಕ ಸಂಬಂಧಿತ ID ಗಳನ್ನು ರಚಿಸುವುದು

ಒಂದೇ ಕಾಂಪೊನೆಂಟ್‌ನಲ್ಲಿ ಹಲವಾರು ಸಂಬಂಧಿತ ID ಗಳನ್ನು ರಚಿಸುವುದು ಒಂದು ಸಾಮಾನ್ಯ ಅವಶ್ಯಕತೆಯಾಗಿದೆ. ಉದಾಹರಣೆಗೆ, ಒಂದು ಇನ್‌ಪುಟ್‌ಗೆ ತನ್ನದೇ ಆದ ID ಮತ್ತು `aria-describedby` ಮೂಲಕ ಲಿಂಕ್ ಮಾಡಲಾದ ವಿವರಣಾ ಅಂಶಕ್ಕಾಗಿ ಇನ್ನೊಂದು ID ಬೇಕಾಗಬಹುದು.

ನೀವು `useId` ಅನ್ನು ಹಲವು ಬಾರಿ ಕರೆಯಲು ಪ್ರಚೋದಿತರಾಗಬಹುದು:


// ಇದು ಶಿಫಾರಸು ಮಾಡಲಾದ ಮಾದರಿಯಲ್ಲ
const inputId = useId();
const descriptionId = useId();

ಇದು ಕೆಲಸ ಮಾಡಿದರೂ, ಶಿಫಾರಸು ಮಾಡಲಾದ ಮಾದರಿಯೆಂದರೆ ಪ್ರತಿ ಕಾಂಪೊನೆಂಟ್‌ಗೆ ಒಮ್ಮೆ `useId` ಅನ್ನು ಕರೆದು, ಹಿಂತಿರುಗಿದ ಬೇಸ್ ID ಯನ್ನು ನಿಮಗೆ ಬೇಕಾದ ಇತರ ID ಗಳಿಗೆ ಪೂರ್ವಪ್ರತ್ಯಯವಾಗಿ (prefix) ಬಳಸುವುದು.


import { useId } from 'react';

function FormFieldWithDescription({ label, description }) {
  const baseId = useId();
  const inputId = `${baseId}-input`;
  const descriptionId = `${baseId}-description`;

  return (
    

{description}

); }

ಈ ಮಾದರಿ ಏಕೆ ಉತ್ತಮ?

ಅತ್ಯುತ್ತಮ ವೈಶಿಷ್ಟ್ಯ: ದೋಷರಹಿತ ಸರ್ವರ್-ಸೈಡ್ ರೆಂಡರಿಂಗ್ (SSR)

`useId` ಅನ್ನು ನಿರ್ಮಿಸಲಾದ ಮೂಲ ಸಮಸ್ಯೆಯನ್ನು ಮತ್ತೆ ನೋಡೋಣ: Next.js, Remix, ಅಥವಾ Gatsby ನಂತಹ SSR ಪರಿಸರಗಳಲ್ಲಿ ಹೈಡ್ರೇಷನ್ ಮಿಸ್‌ಮ್ಯಾಚ್‌ಗಳು.

ಸನ್ನಿವೇಶ: ಹೈಡ್ರೇಷನ್ ಮಿಸ್‌ಮ್ಯಾಚ್ ದೋಷ

Next.js ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ನಮ್ಮ ಹಳೆಯ `Math.random()` ವಿಧಾನವನ್ನು ಬಳಸುವ ಒಂದು ಕಾಂಪೊನೆಂಟ್ ಅನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ.

  1. ಸರ್ವರ್ ರೆಂಡರ್: ಸರ್ವರ್ ಕಾಂಪೊನೆಂಟ್ ಕೋಡ್ ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ. `Math.random()` `0.5` ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ. ಸರ್ವರ್ ಬ್ರೌಸರ್‌ಗೆ `` ನೊಂದಿಗೆ HTML ಕಳುಹಿಸುತ್ತದೆ.
  2. ಕ್ಲೈಂಟ್ ರೆಂಡರ್ (ಹೈಡ್ರೇಷನ್): ಬ್ರೌಸರ್ HTML ಮತ್ತು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಬಂಡಲ್ ಅನ್ನು ಪಡೆಯುತ್ತದೆ. ರಿಯಾಕ್ಟ್ ಕ್ಲೈಂಟ್‌ನಲ್ಲಿ ಪ್ರಾರಂಭವಾಗಿ ಈವೆಂಟ್ ಲಿಸನರ್‌ಗಳನ್ನು ಲಗತ್ತಿಸಲು ಕಾಂಪೊನೆಂಟ್ ಅನ್ನು ಮರು-ರೆಂಡರ್ ಮಾಡುತ್ತದೆ (ಈ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಹೈಡ್ರೇಷನ್ ಎಂದು ಕರೆಯಲಾಗುತ್ತದೆ). ಈ ರೆಂಡರ್ ಸಮಯದಲ್ಲಿ, `Math.random()` `0.9` ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ. ರಿಯಾಕ್ಟ್ `` ನೊಂದಿಗೆ ವರ್ಚುವಲ್ DOM ಅನ್ನು ರಚಿಸುತ್ತದೆ.
  3. ಮಿಸ್‌ಮ್ಯಾಚ್: ರಿಯಾಕ್ಟ್ ಸರ್ವರ್-ರಚಿತ HTML (`id="input-0.5"`) ಅನ್ನು ಕ್ಲೈಂಟ್-ರಚಿತ ವರ್ಚುವಲ್ DOM (`id="input-0.9"`) ನೊಂದಿಗೆ ಹೋಲಿಸುತ್ತದೆ. ಇದು ವ್ಯತ್ಯಾಸವನ್ನು ಕಂಡು ಒಂದು ಎಚ್ಚರಿಕೆಯನ್ನು ನೀಡುತ್ತದೆ: "Warning: Prop `id` did not match. Server: "input-0.5" Client: "input-0.9"".

ಇದು ಕೇವಲ ಒಂದು ಕಾಸ್ಮೆಟಿಕ್ ಎಚ್ಚರಿಕೆಯಲ್ಲ. ಇದು ಮುರಿದ UI, ತಪ್ಪಾದ ಈವೆಂಟ್ ಹ್ಯಾಂಡ್ಲಿಂಗ್, ಮತ್ತು ಕಳಪೆ ಬಳಕೆದಾರ ಅನುಭವಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು. ರಿಯಾಕ್ಟ್ ಸರ್ವರ್-ರೆಂಡರ್ ಮಾಡಿದ HTML ಅನ್ನು ತಿರಸ್ಕರಿಸಿ ಪೂರ್ಣ ಕ್ಲೈಂಟ್-ಸೈಡ್ ರೆಂಡರ್ ಮಾಡಬೇಕಾಗಬಹುದು, ಇದು SSR ನ ಕಾರ್ಯಕ್ಷಮತೆಯ ಪ್ರಯೋಜನಗಳನ್ನು ನಿಷ್ಫಲಗೊಳಿಸುತ್ತದೆ.

ಸನ್ನಿವೇಶ: `useId` ಪರಿಹಾರ

ಈಗ, `useId` ಇದನ್ನು ಹೇಗೆ ಸರಿಪಡಿಸುತ್ತದೆ ಎಂದು ನೋಡೋಣ.

  1. ಸರ್ವರ್ ರೆಂಡರ್: ಸರ್ವರ್ ಕಾಂಪೊನೆಂಟ್ ಅನ್ನು ರೆಂಡರ್ ಮಾಡುತ್ತದೆ. `useId` ಅನ್ನು ಕರೆಯಲಾಗುತ್ತದೆ. ಟ್ರೀಯಲ್ಲಿನ ಕಾಂಪೊನೆಂಟ್‌ನ ಸ್ಥಾನವನ್ನು ಆಧರಿಸಿ, ಅದು ಒಂದು ಸ್ಥಿರ ID ಯನ್ನು ರಚಿಸುತ್ತದೆ, ಉದಾಹರಣೆಗೆ `":r5:"`. ಸರ್ವರ್ `` ನೊಂದಿಗೆ HTML ಕಳುಹಿಸುತ್ತದೆ.
  2. ಕ್ಲೈಂಟ್ ರೆಂಡರ್ (ಹೈಡ್ರೇಷನ್): ಬ್ರೌಸರ್ HTML ಮತ್ತು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಪಡೆಯುತ್ತದೆ. ರಿಯಾಕ್ಟ್ ಹೈಡ್ರೇಟ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸುತ್ತದೆ. ಅದು ಅದೇ ಕಾಂಪೊನೆಂಟ್ ಅನ್ನು ಟ್ರೀಯಲ್ಲಿ ಅದೇ ಸ್ಥಾನದಲ್ಲಿ ರೆಂಡರ್ ಮಾಡುತ್ತದೆ. `useId` ಹುಕ್ ಮತ್ತೆ ಚಲಿಸುತ್ತದೆ. ಅದರ ಫಲಿತಾಂಶವು ಟ್ರೀ ರಚನೆಯನ್ನು ಆಧರಿಸಿ ನಿರ್ಣಾಯಕವಾಗಿರುವುದರಿಂದ, ಅದು ನಿಖರವಾಗಿ ಅದೇ ID ಯನ್ನು ರಚಿಸುತ್ತದೆ: `":r5:"`.
  3. ಸಂಪೂರ್ಣ ಹೊಂದಾಣಿಕೆ: ರಿಯಾಕ್ಟ್ ಸರ್ವರ್-ರಚಿತ HTML (`id=":r5:"`) ಅನ್ನು ಕ್ಲೈಂಟ್-ರಚಿತ ವರ್ಚುವಲ್ DOM (`id=":r5:"`) ನೊಂದಿಗೆ ಹೋಲಿಸುತ್ತದೆ. ಅವು ಸಂಪೂರ್ಣವಾಗಿ ಹೊಂದಿಕೆಯಾಗುತ್ತವೆ. ಯಾವುದೇ ದೋಷಗಳಿಲ್ಲದೆ ಹೈಡ್ರೇಷನ್ ಯಶಸ್ವಿಯಾಗಿ ಪೂರ್ಣಗೊಳ್ಳುತ್ತದೆ.

ಈ ಸ್ಥಿರತೆಯೇ `useId` ಯ ಮೌಲ್ಯದ ಪ್ರಸ್ತಾಪದ ಮೂಲಾಧಾರವಾಗಿದೆ. ಇದು ಹಿಂದೆ ದುರ್ಬಲವಾಗಿದ್ದ ಪ್ರಕ್ರಿಯೆಗೆ ವಿಶ್ವಾಸಾರ್ಹತೆ ಮತ್ತು ಭವಿಷ್ಯವನ್ನು ತರುತ್ತದೆ.

ಪ್ರವೇಶಸಾಧ್ಯತೆ (a11y) ಸೂಪರ್‌ಪವರ್ಸ್ `useId` ನೊಂದಿಗೆ

`useId` SSR ಗೆ ನಿರ್ಣಾಯಕವಾಗಿದ್ದರೂ, ಅದರ ಪ್ರಾಥಮಿಕ ದೈನಂದಿನ ಬಳಕೆಯು ಪ್ರವೇಶಸಾಧ್ಯತೆಯನ್ನು ಸುಧಾರಿಸುವುದಾಗಿದೆ. ಸ್ಕ್ರೀನ್ ರೀಡರ್‌ಗಳಂತಹ ಸಹಾಯಕ ತಂತ್ರಜ್ಞಾನಗಳ ಬಳಕೆದಾರರಿಗೆ ಅಂಶಗಳನ್ನು ಸರಿಯಾಗಿ ಸಂಯೋಜಿಸುವುದು ಮೂಲಭೂತವಾಗಿದೆ.

ವಿವಿಧ ARIA (Accessible Rich Internet Applications) ಅಟ್ರಿಬ್ಯೂಟ್‌ಗಳನ್ನು ಜೋಡಿಸಲು `useId` ಒಂದು ಪರಿಪೂರ್ಣ ಸಾಧನವಾಗಿದೆ.

ಉದಾಹರಣೆ: ಪ್ರವೇಶಸಾಧ್ಯವಾದ ಮೋಡಲ್ ಡೈಲಾಗ್

ಒಂದು ಮೋಡಲ್ ಡೈಲಾಗ್ ತನ್ನ ಮುಖ್ಯ ಕಂಟೇನರ್ ಅನ್ನು ಅದರ ಶೀರ್ಷಿಕೆ ಮತ್ತು ವಿವರಣೆಯೊಂದಿಗೆ ಸಂಯೋಜಿಸಬೇಕಾಗುತ್ತದೆ, ಇದರಿಂದ ಸ್ಕ್ರೀನ್ ರೀಡರ್‌ಗಳು ಅವುಗಳನ್ನು ಸರಿಯಾಗಿ ಪ್ರಕಟಿಸಬಹುದು.


import { useId, useState } from 'react';

function AccessibleModal({ title, children }) {
  const id = useId();
  const titleId = `${id}-title`;
  const contentId = `${id}-content`;

  return (
    

{title}

{children}
); } function App() { return (

ಈ ಸೇವೆಯನ್ನು ಬಳಸುವ ಮೂಲಕ, ನೀವು ನಮ್ಮ ನಿಯಮಗಳು ಮತ್ತು ಷರತ್ತುಗಳಿಗೆ ಒಪ್ಪುತ್ತೀರಿ...

); }

ಇಲ್ಲಿ, ಈ `AccessibleModal` ಅನ್ನು ಎಲ್ಲಿ ಬಳಸಿದರೂ, `aria-labelledby` ಮತ್ತು `aria-describedby` ಅಟ್ರಿಬ್ಯೂಟ್‌ಗಳು ಶೀರ್ಷಿಕೆ ಮತ್ತು ವಿಷಯ ಅಂಶಗಳ ಸರಿಯಾದ, ಅನನ್ಯ ID ಗಳಿಗೆ ಸೂಚಿಸುತ್ತವೆ ಎಂದು `useId` ಖಚಿತಪಡಿಸುತ್ತದೆ. ಇದು ಸ್ಕ್ರೀನ್ ರೀಡರ್ ಬಳಕೆದಾರರಿಗೆ ಒಂದು ಅಡೆತಡೆಯಿಲ್ಲದ ಅನುಭವವನ್ನು ಒದಗಿಸುತ್ತದೆ.

ಉದಾಹರಣೆ: ಗುಂಪಿನಲ್ಲಿ ರೇಡಿಯೋ ಬಟನ್‌ಗಳನ್ನು ಸಂಪರ್ಕಿಸುವುದು

ಸಂಕೀರ್ಣ ಫಾರ್ಮ್ ನಿಯಂತ್ರಣಗಳಿಗೆ ಸಾಮಾನ್ಯವಾಗಿ ಎಚ್ಚರಿಕೆಯ ID ನಿರ್ವಹಣೆ ಬೇಕಾಗುತ್ತದೆ. ರೇಡಿಯೋ ಬಟನ್‌ಗಳ ಗುಂಪನ್ನು ಒಂದು ಸಾಮಾನ್ಯ ಲೇಬಲ್‌ನೊಂದಿಗೆ ಸಂಯೋಜಿಸಬೇಕು.


import { useId } from 'react';

function RadioGroup() {
  const id = useId();
  const headingId = `${id}-heading`;

  return (
    

ನಿಮ್ಮ ಜಾಗತಿಕ ಶಿಪ್ಪಿಂಗ್ ಆದ್ಯತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ:

); }

ಒಂದೇ `useId` ಕರೆಯನ್ನು ಪೂರ್ವಪ್ರತ್ಯಯವಾಗಿ ಬಳಸುವ ಮೂಲಕ, ನಾವು ಎಲ್ಲೆಡೆ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಒಂದು ಸುಸಂಬದ್ಧ, ಪ್ರವೇಶಸಾಧ್ಯ, ಮತ್ತು ಅನನ್ಯ ನಿಯಂತ್ರಣಗಳ ಗುಂಪನ್ನು ರಚಿಸುತ್ತೇವೆ.

ಪ್ರಮುಖ ವ್ಯತ್ಯಾಸಗಳು: `useId` ಯಾವುದಕ್ಕೆ ಅಲ್ಲ

ದೊಡ್ಡ ಶಕ್ತಿಯೊಂದಿಗೆ ದೊಡ್ಡ ಜವಾಬ್ದಾರಿ ಬರುತ್ತದೆ. `useId` ಅನ್ನು ಎಲ್ಲಿ ಬಳಸಬಾರದು ಎಂದು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು ಅಷ್ಟೇ ಮುಖ್ಯ.

ಪಟ್ಟಿ ಕೀಗಳಿಗಾಗಿ `useId` ಬಳಸಬೇಡಿ

ಇದು ಡೆವಲಪರ್‌ಗಳು ಮಾಡುವ ಅತ್ಯಂತ ಸಾಮಾನ್ಯ ತಪ್ಪು. ರಿಯಾಕ್ಟ್ ಕೀಗಳು ಒಂದು ನಿರ್ದಿಷ್ಟ ಡೇಟಾ ತುಣುಕಿಗೆ ಸ್ಥಿರ ಮತ್ತು ಅನನ್ಯ ಗುರುತಿಸುವಿಕೆಗಳಾಗಿರಬೇಕು, ಕಾಂಪೊನೆಂಟ್ ಉದಾಹರಣೆಗಾಗಿ ಅಲ್ಲ.

ತಪ್ಪಾದ ಬಳಕೆ:


function TodoList({ todos }) {
  // ಆಂಟಿ-ಪ್ಯಾಟರ್ನ್: ಕೀಗಳಿಗಾಗಿ useId ಅನ್ನು ಎಂದಿಗೂ ಬಳಸಬೇಡಿ!
  return (
    
    {todos.map(todo => { const key = useId(); // ಇದು ತಪ್ಪು! return
  • {todo.text}
  • ; })}
); }

ಈ ಕೋಡ್ ಹುಕ್ಸ್‌ಗಳ ನಿಯಮಗಳನ್ನು (ನೀವು ಲೂಪ್ ಒಳಗೆ ಹುಕ್ ಅನ್ನು ಕರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ) ಉಲ್ಲಂಘಿಸುತ್ತದೆ. ಆದರೆ ನೀವು ಅದನ್ನು ವಿಭಿನ್ನವಾಗಿ ರಚಿಸಿದರೂ, ತರ್ಕವು ದೋಷಪೂರಿತವಾಗಿದೆ. `key` `todo` ಐಟಂಗೆ ಸ್ವತಃ `todo.id` ನಂತೆ ಸಂಬಂಧಿಸಿರಬೇಕು. ಇದು ಐಟಂಗಳನ್ನು ಸೇರಿಸಿದಾಗ, ತೆಗೆದುಹಾಕಿದಾಗ, ಅಥವಾ ಮರು-ಕ್ರಮಗೊಳಿಸಿದಾಗ ರಿಯಾಕ್ಟ್ ಸರಿಯಾಗಿ ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ.

ಕೀ ಗಾಗಿ `useId` ಅನ್ನು ಬಳಸುವುದು ರೆಂಡರಿಂಗ್ ಸ್ಥಾನಕ್ಕೆ (ಉದಾ., ಮೊದಲ `

  • `) ಸಂಬಂಧಿಸಿದ ID ಯನ್ನು ರಚಿಸುತ್ತದೆ, ಡೇಟಾಗೆ ಅಲ್ಲ. ನೀವು ಟುಡೊಗಳನ್ನು ಮರು-ಕ್ರಮಗೊಳಿಸಿದರೆ, ಕೀಗಳು ಅದೇ ರೆಂಡರ್ ಕ್ರಮದಲ್ಲಿ ಉಳಿಯುತ್ತವೆ, ಇದು ರಿಯಾಕ್ಟ್ ಅನ್ನು ಗೊಂದಲಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಬಗ್‌ಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತದೆ.

    ಸರಿಯಾದ ಬಳಕೆ:

    
    function TodoList({ todos }) {
      return (
        
      {todos.map(todo => ( // ಸರಿ: ನಿಮ್ಮ ಡೇಟಾದಿಂದ ಒಂದು ID ಬಳಸಿ.
    • {todo.text}
    • ))}
    ); }

    ಡೇಟಾಬೇಸ್ ಅಥವಾ CSS ID ಗಳನ್ನು ರಚಿಸಲು `useId` ಬಳಸಬೇಡಿ

    `useId` ನಿಂದ ರಚಿತವಾದ ID ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು (ಉದಾಹರಣೆಗೆ `:`) ಹೊಂದಿರುತ್ತದೆ ಮತ್ತು ಇದು ರಿಯಾಕ್ಟ್‌ನ ಆಂತರಿಕ ವಿವರವಾಗಿದೆ. ಇದು ಡೇಟಾಬೇಸ್ ಕೀ, ಸ್ಟೈಲಿಂಗ್‌ಗಾಗಿ CSS ಸೆಲೆಕ್ಟರ್, ಅಥವಾ `document.querySelector` ನೊಂದಿಗೆ ಬಳಸಲು ಉದ್ದೇಶಿಸಿಲ್ಲ.

    • ಡೇಟಾಬೇಸ್ ID ಗಳಿಗಾಗಿ: `uuid` ನಂತಹ ಲೈಬ್ರರಿ ಅಥವಾ ನಿಮ್ಮ ಡೇಟಾಬೇಸ್‌ನ ಸ್ಥಳೀಯ ID ರಚನೆ ಯಾಂತ್ರಿಕತೆಯನ್ನು ಬಳಸಿ. ಇವುಗಳು ನಿರಂತರ ಸಂಗ್ರಹಣೆಗೆ ಸೂಕ್ತವಾದ ಸಾರ್ವತ್ರಿಕವಾಗಿ ಅನನ್ಯ ಗುರುತಿಸುವಿಕೆಗಳು (UUIDs) ಆಗಿವೆ.
    • CSS ಸೆಲೆಕ್ಟರ್‌ಗಳಿಗಾಗಿ: CSS ಕ್ಲಾಸ್‌ಗಳನ್ನು ಬಳಸಿ. ಸ್ಟೈಲಿಂಗ್‌ಗಾಗಿ ಸ್ವಯಂ-ರಚಿತ ID ಗಳನ್ನು ಅವಲಂಬಿಸುವುದು ಒಂದು ದುರ್ಬಲ ಅಭ್ಯಾಸವಾಗಿದೆ.

    `useId` vs. `uuid` ಲೈಬ್ರರಿ: ಯಾವುದನ್ನು ಯಾವಾಗ ಬಳಸಬೇಕು

    ಒಂದು ಸಾಮಾನ್ಯ ಪ್ರಶ್ನೆಯೆಂದರೆ, "`uuid` ನಂತಹ ಲೈಬ್ರರಿಯನ್ನು ಏಕೆ ಬಳಸಬಾರದು?" ಉತ್ತರವು ಅವುಗಳ ವಿಭಿನ್ನ ಉದ್ದೇಶಗಳಲ್ಲಿದೆ.

    ವೈಶಿಷ್ಟ್ಯ ರಿಯಾಕ್ಟ್ `useId` `uuid` ಲೈಬ್ರರಿ
    ಪ್ರಾಥಮಿಕ ಬಳಕೆಯ ಕ್ಷೇತ್ರ DOM ಎಲಿಮೆಂಟ್‌ಗಳಿಗಾಗಿ ಸ್ಥಿರ ID ಗಳನ್ನು ರಚಿಸುವುದು, ಮುಖ್ಯವಾಗಿ ಪ್ರವೇಶಸಾಧ್ಯತೆ ಅಟ್ರಿಬ್ಯೂಟ್‌ಗಳಿಗಾಗಿ (`htmlFor`, `aria-*`). ಡೇಟಾಗಾಗಿ ಸಾರ್ವತ್ರಿಕವಾಗಿ ಅನನ್ಯ ಗುರುತಿಸುವಿಕೆಗಳನ್ನು (ಉದಾಹರಣೆಗೆ, ಡೇಟಾಬೇಸ್ ಕೀಗಳು, ಆಬ್ಜೆಕ್ಟ್ ಐಡೆಂಟಿಫೈಯರ್‌ಗಳು) ರಚಿಸುವುದು.
    SSR ಸುರಕ್ಷತೆ ಹೌದು. ಇದು ನಿರ್ಣಾಯಕವಾಗಿದೆ ಮತ್ತು ಸರ್ವರ್ ಹಾಗೂ ಕ್ಲೈಂಟ್‌ನಲ್ಲಿ ಒಂದೇ ಆಗಿರುವುದು ಖಚಿತ. ಇಲ್ಲ. ಇದು ಯಾದೃಚ್ಛಿಕತೆಯನ್ನು (randomness) ಆಧರಿಸಿದೆ ಮತ್ತು ರೆಂಡರ್ ಸಮಯದಲ್ಲಿ ಕರೆದರೆ ಹೈಡ್ರೇಷನ್ ಮಿಸ್‌ಮ್ಯಾಚ್‌ಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತದೆ.
    ಅನನ್ಯತೆ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್‌ನ ಒಂದೇ ರೆಂಡರ್‌ನಲ್ಲಿ ಅನನ್ಯವಾಗಿರುತ್ತದೆ. ಎಲ್ಲಾ ಸಿಸ್ಟಮ್‌ಗಳು ಮತ್ತು ಸಮಯದಾದ್ಯಂತ ಜಾಗತಿಕವಾಗಿ ಅನನ್ಯವಾಗಿದೆ (ಘರ್ಷಣೆಯ ಸಂಭವನೀಯತೆ ಅತ್ಯಂತ ಕಡಿಮೆ).
    ಯಾವಾಗ ಬಳಸಬೇಕು ನೀವು ರೆಂಡರ್ ಮಾಡುತ್ತಿರುವ ಕಾಂಪೊನೆಂಟ್‌ನಲ್ಲಿನ ಒಂದು ಎಲಿಮೆಂಟ್‌ಗಾಗಿ ID ಬೇಕಾದಾಗ. ನೀವು ಹೊಸ ಡೇಟಾ ಐಟಂ ಅನ್ನು ರಚಿಸಿದಾಗ (ಉದಾಹರಣೆಗೆ, ಹೊಸ ಟುಡೊ, ಹೊಸ ಬಳಕೆದಾರ) ಅದಕ್ಕೆ ನಿರಂತರ, ಅನನ್ಯ ಗುರುತಿಸುವಿಕೆ ಬೇಕಾದಾಗ.

    ಹೆಬ್ಬೆರಳಿನ ನಿಯಮ: ID ನಿಮ್ಮ ರಿಯಾಕ್ಟ್ ಕಾಂಪೊನೆಂಟ್‌ನ ರೆಂಡರ್ ಔಟ್‌ಪುಟ್‌ನ ಒಳಗೆ ಇರುವ ಯಾವುದಕ್ಕಾದರೂ ಆಗಿದ್ದರೆ, `useId` ಬಳಸಿ. ID ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್ ರೆಂಡರ್ ಮಾಡುತ್ತಿರುವ ಡೇಟಾ ತುಣುಕಿಗೆ ಆಗಿದ್ದರೆ, ಡೇಟಾ ರಚಿಸಿದಾಗ ಉತ್ಪತ್ತಿಯಾದ ಸರಿಯಾದ UUID ಬಳಸಿ.

    ತೀರ್ಮಾನ ಮತ್ತು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು

    `useId` ಹುಕ್ ಡೆವಲಪರ್ ಅನುಭವವನ್ನು ಸುಧಾರಿಸಲು ಮತ್ತು ಹೆಚ್ಚು ದೃಢವಾದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ರಚನೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ರಿಯಾಕ್ಟ್ ತಂಡದ ಬದ್ಧತೆಗೆ ಒಂದು ಸಾಕ್ಷಿಯಾಗಿದೆ. ಇದು ಐತಿಹಾಸಿಕವಾಗಿ ಒಂದು ಕಷ್ಟಕರವಾದ ಸಮಸ್ಯೆಯನ್ನು—ಸರ್ವರ್/ಕ್ಲೈಂಟ್ ಪರಿಸರದಲ್ಲಿ ಸ್ಥಿರ ID ರಚನೆ—ತೆಗೆದುಕೊಂಡು, ಸರಳ, ಶಕ್ತಿಯುತ, ಮತ್ತು ಫ್ರೇಮ್‌ವರ್ಕ್‌ನಲ್ಲಿಯೇ ನಿರ್ಮಿಸಲಾದ ಒಂದು ಪರಿಹಾರವನ್ನು ಒದಗಿಸುತ್ತದೆ.

    ಅದರ ಉದ್ದೇಶ ಮತ್ತು ಮಾದರಿಗಳನ್ನು ಆಂತರಿಕಗೊಳಿಸುವ ಮೂಲಕ, ನೀವು ಸ್ವಚ್ಛ, ಹೆಚ್ಚು ಪ್ರವೇಶಸಾಧ್ಯವಾದ, ಮತ್ತು ಹೆಚ್ಚು ವಿಶ್ವಾಸಾರ್ಹ ಕಾಂಪೊನೆಂಟ್‌ಗಳನ್ನು ಬರೆಯಬಹುದು, ವಿಶೇಷವಾಗಿ SSR, ಕಾಂಪೊನೆಂಟ್ ಲೈಬ್ರರಿಗಳು, ಮತ್ತು ಸಂಕೀರ್ಣ ಫಾರ್ಮ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ.

    ಪ್ರಮುಖ ಅಂಶಗಳು ಮತ್ತು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು:

    • `htmlFor`, `id`, ಮತ್ತು `aria-*` ನಂತಹ ಪ್ರವೇಶಸಾಧ್ಯತೆ ಅಟ್ರಿಬ್ಯೂಟ್‌ಗಳಿಗಾಗಿ ಅನನ್ಯ ID ಗಳನ್ನು ರಚಿಸಲು `useId` ಬಳಸಿ.
    • ನಿಮಗೆ ಅನೇಕ ಸಂಬಂಧಿತ ID ಗಳು ಬೇಕಾದರೆ ಪ್ರತಿ ಕಾಂಪೊನೆಂಟ್‌ಗೆ ಒಮ್ಮೆ `useId` ಕರೆಯಿರಿ ಮತ್ತು ಫಲಿತಾಂಶವನ್ನು ಪೂರ್ವಪ್ರತ್ಯಯವಾಗಿ ಬಳಸಿ.
    • ಸರ್ವರ್-ಸೈಡ್ ರೆಂಡರಿಂಗ್ (SSR) ಅಥವಾ ಸ್ಟ್ಯಾಟಿಕ್ ಸೈಟ್ ಜನರೇಷನ್ (SSG) ಬಳಸುವ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ಹೈಡ್ರೇಷನ್ ದೋಷಗಳನ್ನು ತಡೆಯಲು `useId` ಅನ್ನು ಅಳವಡಿಸಿಕೊಳ್ಳಿ.
    • ಪಟ್ಟಿಗಳನ್ನು ರೆಂಡರ್ ಮಾಡುವಾಗ `key` ಪ್ರಾಪ್‌ಗಳನ್ನು ರಚಿಸಲು `useId` ಅನ್ನು ಬಳಸಬೇಡಿ. ಕೀಗಳು ನಿಮ್ಮ ಡೇಟಾದಿಂದ ಬರಬೇಕು.
    • `useId` ನಿಂದ ಹಿಂತಿರುಗಿದ ಸ್ಟ್ರಿಂಗ್‌ನ ನಿರ್ದಿಷ್ಟ ಸ್ವರೂಪವನ್ನು ಅವಲಂಬಿಸಬೇಡಿ. ಇದು ಒಂದು ಆಂತರಿಕ ವಿವರವಾಗಿದೆ.
    • ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಉಳಿಸಬೇಕಾದ ಅಥವಾ CSS ಸ್ಟೈಲಿಂಗ್‌ಗಾಗಿ ಬಳಸಬೇಕಾದ ID ಗಳನ್ನು ರಚಿಸಲು `useId` ಅನ್ನು ಬಳಸಬೇಡಿ. ಸ್ಟೈಲಿಂಗ್‌ಗಾಗಿ ಕ್ಲಾಸ್‌ಗಳನ್ನು ಮತ್ತು ಡೇಟಾ ಗುರುತಿಸುವಿಕೆಗಳಿಗಾಗಿ `uuid` ನಂತಹ ಲೈಬ್ರರಿಯನ್ನು ಬಳಸಿ.

    ಮುಂದಿನ ಬಾರಿ ನೀವು ಒಂದು ಕಾಂಪೊನೆಂಟ್‌ನಲ್ಲಿ ID ರಚಿಸಲು `Math.random()` ಅಥವಾ ಕಸ್ಟಮ್ ಕೌಂಟರ್ ಅನ್ನು ಬಳಸಲು ಹೋದಾಗ, ನಿಲ್ಲಿಸಿ ಮತ್ತು ನೆನಪಿಡಿ: ರಿಯಾಕ್ಟ್ ಉತ್ತಮ ಮಾರ್ಗವನ್ನು ಹೊಂದಿದೆ. `useId` ಬಳಸಿ ಮತ್ತು ಆತ್ಮವಿಶ್ವಾಸದಿಂದ ನಿರ್ಮಿಸಿ.

  • ರಿಯಾಕ್ಟ್‌ನ useId ಹುಕ್: ಸ್ಥಿರ ಮತ್ತು ಅನನ್ಯ ಗುರುತಿಸುವಿಕೆಗಳ ರಚನೆಯ ಆಳವಾದ ನೋಟ | MLOG